﻿//typedef struct MyCircularQueue {
//    int data;
//    struct MyCircularQueue* before;
//    struct MyCircularQueue* next;
//} MyCircularQueue;
//
//MyCircularQueue* head = NULL, * tail = NULL;//搞个全局变量，免得指向打的麻烦
//
//MyCircularQueue* myCircularQueueCreate(int k) {//创建双向循环链式队列
//    int sum = k + 1;
//    while (sum--)
//    {
//        MyCircularQueue* newnode = (MyCircularQueue*)malloc(sizeof(MyCircularQueue));
//        newnode->next = NULL;
//        newnode->data = 0;
//        if (head == NULL)
//        {
//            head = tail = newnode;
//            tail->next = head;
//            head->before = tail;
//        }
//        else
//        {
//            tail->next = newnode;
//            newnode->before = tail;
//            newnode->next = head;
//            tail = newnode;
//            head->before = tail;
//        }
//    }
//    tail = head;
//    return head;
//}
//bool myCircularQueueIsEmpty(MyCircularQueue* obj);
//bool myCircularQueueIsFull(MyCircularQueue* obj);//使用前进行声明，要不然报错类型不匹配
//
//bool myCircularQueueEnQueue(MyCircularQueue* obj, int value) {//加数
//    if (myCircularQueueIsFull(obj))
//        return false;
//    else
//    {
//        tail->data = value;
//        tail = tail->next;
//    }
//    return true;
//}
//
//bool myCircularQueueDeQueue(MyCircularQueue* obj) {//删数
//    if (myCircularQueueIsEmpty(obj))
//        return false;
//    else
//    {
//        head = head->next;
//    }
//    return true;
//}
//
//int myCircularQueueFront(MyCircularQueue* obj) {//取队头
//    if (myCircularQueueIsEmpty(obj))
//        return -1;
//    else
//        return head->data;
//}
//
//int myCircularQueueRear(MyCircularQueue* obj) {//取对尾
//    if (myCircularQueueIsEmpty(obj))
//        return -1;
//    else
//        return tail->before->data;
//}
////因为多开了一个节点，所以当haed==tail时，他们为空
//bool myCircularQueueIsEmpty(MyCircularQueue* obj) {//判断是否为空
//    if (head == tail)
//        return true;
//    else
//        return false;
//}
////当tail的下一个为head时，就满了
//bool myCircularQueueIsFull(MyCircularQueue* obj) {//判断是否满了
//    if (tail->next == head)
//        return true;
//    else
//        return false;
//}
//
//void myCircularQueueFree(MyCircularQueue* obj) {//释放空间
//    while (head != tail)
//    {
//        MyCircularQueue* tmp = head;
//        head = head->next;
//        free(tmp);
//    }
//    free(head);
//    head = tail = NULL;
//}